Skip to main content

第 15 课:序列模型 和 注意力机制

( Sequence models & Attention mechanism)

(一)Sequence to Sequence 模型(Seq2Seq)

比如你想输入一个法语句子 “Jane visite I'Afrique en septembre.”,
将它翻译成一个英语句子 ,“Jane is visiting Africa in September.”。
和之前一样,我们用 𝑥<1>𝑥^{<1>} 一直到 𝑥<5>𝑥^{<5>} 来表示输入的句子的单词,然后我们用 𝑦<1>𝑦^{<1>}𝑦<6>𝑦^{<6>}来表示输出的句子的单词,

使用的神经网络如下:

image-20250619224433082

在上图中,前半部分叫做 编码网络(encoder network),是一个 RNN的结构, RNN的单元可以是 GRU 也可以是 LSTM
后半部分是 解码网络, 被训练为每次输出一个翻译后的单词,直到它输出 <EOC>

还有一个与此类似的结构被用来做图像描述
前半部分是一个Alexnet 去掉最后的 softmax单元, 后半部分是RNN来生成图像描述

image-20250619224605818

语言模型和机器翻译有什么区别呢?

image-20250619224539660

语言模型所做的事情是能够估计句子的可能性,
机器翻译模型 里的decoder网络 几乎和语言模型一样, 区别在于 语言模型总是以零向量开始,而 decoder网络 不是
decoder网络 以 encoder网络 的输出作为输入,因此 叫做条件语言模型(conditional language model)。

类比于 语言模型 是输出任意句子的概率,翻译模型 真正做的 其实是估计一个英文翻译 相对于输入的法语句子 的概率
所以在开发机器翻译系统时,需想出一个算法,用来找出合适的 𝑦值,使得 P(y | x) 最大化,这就需要使用 束搜索(Beam Search)

在英语中各种词汇的组合数量很多,如果你的字典中有 10,000个单词,并且翻译输出 10个词
那么可能的组合就有 10,000的 10次方这么多,不可能去计算每一种组合的可能性。
因此我们使用一个近似的搜索算法,它会尽力地挑选出句子 𝑦 使得条件概率最大化,尽管它不能保证找到的 𝑦值一定可以使概率最大化。

为什么不用贪心搜索(Greedy Search)

贪心搜索生成第一个词的分布以后,会马上继续挑选出最有可能的第二个词,然后继续挑选第三个最有可能的词
但是你真正需要的是一次性挑选出整个单词序列,从 𝑦<1>𝑦^{<1>}𝑦<2>𝑦^{<2>}𝑦<𝑇𝑦>𝑦^{<𝑇𝑦>} 来使得整体的概率最大化。
所以这种贪心算法其实并不管用

集束搜索算法会有一个参数 B,叫做集束宽 (beam width)。这里 B=3
集束搜索算法的步骤如下:

image-20250619224456093

  1. 输入编码值后,首先评估第一个输出单词 y 的概率是多少。由于B=3,所以算法会一次考虑3个最有可能的结果
    softmax 会输出1000个概率值,取前三个,比如第一个单词最可能的三个选项是 in、 jane、 september,
  2. 针对每个第一个单词考虑第二个单词是什么,比如 单词 in后面的第二个单词可能是 a或者是 aaron
    具体做法是把 𝑦<1>𝑦^{<1>} 设为单词 in,然后把它喂到 x<2>x^{<2>},因为它的目的是努力找出 第一个单词是 in的情况下,第二个单词是什么。
    按照概率学,这个等于第一个单词的概率乘以第二个单词的概率
    由于第二步的字典大小也是10000,所以总共有 3*10000=30000 种输出。由于B=3,所以还是取其中前 3 个
    比如个这 30,000个选择里最可能的是 “in September” “jane is”以及 “jane visits”
  3. 同样的道理生成剩下的句子,每一步都保留最大的 3 个结果
  4. 终止在句尾符号

注意:

  1. 不难发现, 如果集束宽 B=1, 那其实就是贪婪算法
  2. 在产品中,把束宽设到 10。对科研而言,人们想压榨出全部性能,用束宽为 1000或者 3000
    当 B很大的时候,性能提高会越来越少。

我们刚刚讲到, “这个等于第一个单词的概率乘以第二个单词的概率”,但是由于概率都小于1,反复相乘后会变得很小,超出计算机存储极限

P(v<1>X)P(v<2>X,v<1>)P(v<3>X,v<1>,v<2>),,P(v<Ty>X,v<1>,,v<Ty1>)P(v^{<1>} \mid X) * P(v^{<2>} \mid X, v^{<1>}) * P(v^{<3>} \mid X, v^{<1>}, v^{<2>}), \ldots, P(v^{<T_y>} \mid X, v^{<1>}, \ldots, v^{<T_y-1>})

因此在实践中,我们会取 log 值,最大化这个 𝑙𝑜𝑔求和的概率值,因为 𝑙𝑜𝑔函数严格单调递增

image-20250619224516875

然而这样改进过的算法还有问题,那就是当字数越多时,乘积概率会越小,所以算法结果会不自然地倾向于 词数少的输出

因此我们通过除以翻译结果的单词数量,把它归一化。
这样就是取 每个单词的概率对数值 的平均了,很明显地减少了对输出长的结果的惩罚
或者柔和一点,不直接除以单词数量,而是给单词数量加上一个指数a,a的大小是另一个超参数

如果算法出现错误(比人工翻译得更差),怎么判断是 集束搜索算法 出问题,还是RNN出问题了呢?
RNN 实际上是个编码器和解码器,它会计算 𝑃(𝑦|𝑥)。
接下来用这个模型来计算 𝑃(𝑦𝑥)𝑃(𝑦^*|𝑥),同时也用你的 RNN模型来计算 𝑃(𝑦^𝑥)𝑃(\hat 𝑦|𝑥),然后比较一下这两个值哪个更大。

𝑃(𝑦𝑥)𝑃(𝑦^*|𝑥) > 𝑃(𝑦^𝑥)𝑃(\hat 𝑦|𝑥):意味着束搜索算法选择了 y^\hat y ,而是事实上 y* 能得到更大的值,所以束搜索算法出问题了
𝑃(𝑦𝑥)𝑃(𝑦^*|𝑥)𝑃(𝑦^𝑥)𝑃(\hat 𝑦|𝑥):在我们的例子中, 𝑦∗ 是比 y^\hat y 更好的翻译结果,所以 RNN 出问题了

但不是一次判断就可以的,需要拿多个样本判断,最后统计出错误的原因是哪个的次数更多,才决定是哪个有问题。

(三)Blue 得分

(四)注意力机制(Attention Model Intuition)

我们知道人工翻译是看一部分翻译一部分,而不是先看完并记住整个句子再翻译,因为记忆整个的像这样的的句子是非常困难的。

编码解码结构中,对于短句子效果非常好(相对高的 Bleu分),
但是对于长句子(大于40词)而言,它的表现就会变差(Blue 分降低),
因为在神经网络中,记忆非常长句子是非常困难的。

注意力模型(the Attention Model) 就是 一次翻译句子的一部分。所以性能不会随着句子变长 而 降低

如下图,核心在于 注意力权重即 𝑎<𝑡,𝑡>𝑎^{<𝑡,𝑡>} 告诉我们,当你尝试生成第 𝑡个英文词,它应该花多少注意力在第 𝑡个法语词上面。
于是 𝑎<𝑡,𝑡>𝑎^{<𝑡,𝑡′>} 就是 𝑦<𝑡>𝑦^{<𝑡>} 应该在 𝑡′时花在 𝑎上注意力的数量。

image-20250619224633109

如何计算注意力权重呢?
如下图,使用一个小的神经网络,𝑠<𝑡1>𝑠^{<𝑡−1>} 就是神经网络在上个时间步的状态

image-20250619224650751

所以其完整结构如下:

注意力模型完整结构1

  1. 编码器
  • Pre-attention Bi-LSTM: 这部分包含了多层的双向长短时记忆网络(Bi-LSTM)。
    每个时间步的输入 x(t)x^{(t)} 被处理,以生成对应的隐状态 a(t)a^{(t)}
    这里的 "Bi" 表示网络在每个时间步考虑前后文信息(即前向和后向)。
    输出是一系列隐状态,这些隐状态包含了输入序列的编码信息,这些信息将被送入注意力层。
  1. 解码器
  • Attention Layer:
    对于解码器的每个时间步 tt,注意力层会查看所有编码器的隐状态 a(1),a(2),...,a(Tx)a^{(1)}, a^{(2)}, ..., a^{(T_x)} 并生成一个上下文向量 context(t)\text{context}^{(t)}
    这个上下文向量是编码器状态的加权和,权重或“注意力分数”基于 解码器的当前状态 和 每个编码器状态的对齐程度 计算得出。

    • Attention Score: 通常使用点积、可缩放点积或其他相关机制来计算当前解码器状态与每个编码器状态的相似度。
    • Softmax: 通过 Softmax 处理注意力分数,以得到归一化的权重。
  • Post-attention LSTM:
    使用上一步得到的上下文向量和前一个输出 s(t1)s^{(t-1)} 来更新LSTM的状态,并生成新的输出 s(t)s^{(t)}
    这个新状态会用于下一个时间步的注意力计算和输出预测。

  • Softmax Output: 最后,解码器的输出 s(t)s^{(t)} 通过另一个Softmax层,输出当前时间步的预测词 y^(t)\hat{y}^{(t)}

注意力模型的关键在于,它允许模型在生成每个输出时“关注”输入序列中的不同部分,而不是仅仅依赖于一个固定的上下文。
这种机制显著提高了处理长序列和保留重要信息(尤其是输入序列较长时)的能力。

注意力模型完整结构2

(五)语音识别

音频数据的常见预处理步骤,就是运行原始的音频片段,然后生成一个声谱图,
横轴是时间,纵轴是声音的频率,而图中不同的颜色,显示了声波能量的大小,也就是在不同的时间和频率上这些声音有多大。